package jschool.manejadores;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import jschool.entidades.Nomina;
import jschool.entidades.PersonalEscolar;
import jschool.persistencia.Conexion;

public class ManejadorDeNomina {
	private ManejadorDeValorDeNomina manejador = ManejadorDeValorDeNomina
			.getInstancia();
	private static ManejadorDeNomina instancia = null;
	private ArrayList<Nomina> nominas = null;
	private Conexion conexion = null;
	private ResultSet rs = null;
	private PreparedStatement stmt = null;
	public double ISR = manejador.getValores()[1];
	public double ARS = manejador.getValores()[2];
	public double SP = manejador.getValores()[3];
	private ArrayList<PersonalEscolar> personal = null;

	private ManejadorDeNomina() {
		conexion = Conexion.getInstancia();
	}

	public static ManejadorDeNomina getInstancia() {
		if (instancia == null) {
			instancia = new ManejadorDeNomina();
		}
		return instancia;
	}

	public ArrayList<Nomina> getNominas() {
		nominas = new ArrayList<Nomina>();
		try {
			String sql = "SELECT * FROM nomina";
			stmt = (PreparedStatement) conexion.hacerEnunciado(sql);
			rs = conexion.hacerConsulta(sql);
			while (rs.next()) {
				Nomina nomina = new Nomina(rs.getInt(1), rs.getDouble(2), rs
						.getDouble(3), rs.getDouble(4), rs.getDouble(5));
				nominas.add(nomina);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, "Error Listando Nomina",
					"Error", JOptionPane.ERROR_MESSAGE);
			return null;
		}
		return nominas;
	}

	public int agregarNomina(PersonalEscolar personal) {
		int fila = 0;
		try {
			String sql = "INSERT INTO Nomina(idEmpleado, impuestoSobreLaRenta,"
					+ " seguroSocial, seguroPension, sueldoNeto) VALUES(?,?,?,?,?)";
			double impuestoRenta = personal.getSueldoBruto() * this.ISR;
			double seguroSocial = personal.getSueldoBruto() * this.ARS;
			double seguroPension = personal.getSueldoBruto() * this.SP;
			stmt = (PreparedStatement) conexion.hacerEnunciado(sql);
			stmt.setInt(1, personal.getidEmpleado());
			stmt.setDouble(2, impuestoRenta);
			stmt.setDouble(3, seguroSocial);
			stmt.setDouble(4, seguroPension);
			stmt.setDouble(5, personal.getSueldoBruto()
					- (impuestoRenta + seguroSocial + seguroPension));
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null,
					"Error Agregando Empleado a la Nomina", "Error",
					JOptionPane.ERROR_MESSAGE);
			return 0;
		} finally {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return fila;
	}

	public int eliminarNomina(int id) {
		int fila = 0;
		try {
			String sql = "DELETE FROM Nomina WHERE idEmpleado = ?";
			stmt = (PreparedStatement) conexion.hacerEnunciado(sql);
			stmt.setInt(1, id);
			fila = stmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null,
					"Error Eliminando Empleado de la Nomina", "Error",
					JOptionPane.ERROR_MESSAGE);
			return 0;
		} finally {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return fila;
	}

	public int modificarNomina(PersonalEscolar personal, int id) {
		int fila = 0;
		try {
			double impuestoRenta = personal.getSueldoBruto() * this.ISR;
			double seguroSocial = personal.getSueldoBruto() * this.ARS;
			double seguroPension = personal.getSueldoBruto() * this.SP;
			String sql = "UPDATE Nomina SET impuestoSobreLaRenta = ?, seguroSocial = ?, "
					+ "seguroPension = ?, sueldoNeto = ? WHERE idEmpleado = ?";
			stmt = (PreparedStatement) conexion.hacerEnunciado(sql);
			stmt.setDouble(1, impuestoRenta);
			stmt.setDouble(2, seguroSocial);
			stmt.setDouble(3, seguroPension);
			stmt.setDouble(4, personal.getSueldoBruto()
					- (impuestoRenta + seguroSocial + seguroPension));
			stmt.setInt(5, id);
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null,
					"Error Modificando Nomina del Empleado", "Error",
					JOptionPane.ERROR_MESSAGE);
			return 0;
		} finally {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return fila;
	}

	public ArrayList<PersonalEscolar> getPersonalEscolar(int id) {
		personal = new ArrayList<PersonalEscolar>();
		try {
			String sql = "SELECT * FROM personalescolar WHERE idEmpleado = "
					+ id + ";";
			stmt = (PreparedStatement) conexion.hacerEnunciado(sql);
			rs = conexion.hacerConsulta(sql);
			while (rs.next()) {
				PersonalEscolar personalEscolar = new PersonalEscolar(rs
						.getInt(1), rs.getString(2), rs.getString(3), rs
						.getString(4), rs.getString(5), rs.getString(6), rs
						.getString(7), rs.getString(8), rs.getString(9), rs
						.getString(10), rs.getString(11), rs.getString(12), rs
						.getString(13), rs.getString(14), rs.getString(15), rs
						.getString(16), rs.getString(17), rs.getString(18), rs
						.getString(19), rs.getString(20), rs.getString(21), rs
						.getString(22), rs.getString(23), rs.getString(24), rs
						.getString(25), rs.getString(26), rs.getString(27), rs
						.getDouble(28), rs.getInt(29), rs.getInt(30), rs
						.getString(31), rs.getString(32), rs.getString(33), rs
						.getString(34));
				personal.add(personalEscolar);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null,
					"Error Listando Personal Escolar", "Error",
					JOptionPane.ERROR_MESSAGE);
		}
		return personal;
	}
}
